/**
 * @file jeu.h
 * Definit les caracteristiques du jeu.
 */
#ifndef _JEU_H
#define _JEU_H
#include <iostream>
#include "Hero.h"
#include "liste_niveau.h"
#include "tableau_monstre.h"
#include "tableau_arme.h"
#include "monstre.h"
using namespace std;

/**
/struct Structure jeu
*/
struct jeu
{
       Hero* hero;///@param hero pointeur sur Hero
       liste_niveau* lniv;///@param lniv pointeur sur liste_niveau
       tableau_monstre* tmon;///@param tmon pointeur sur tableau_monstre
       tableau_arme* tarme;///@param tarme pointeur sur tableau_arme
};

/**
@brief cree le jeu
@param none
@return pointeur sur jeu
*/
jeu* creerJeu();

/**
@brief initialise le jeu
@param jeu* jeu
@return none
*/
void initJeu(jeu* jeu);

/**
@brief supprime le jeu
@param jeu* jeu
@return none
*/
void supprimeJeu(jeu* jeu);

/**
@brief recupère le Hero (et surtout ses donnees ^^")
@param jeu* jeu
@return none
*/
Hero* jeuGetHero(jeu* jeu);

/**
@brief recupère la liste de niveau
@param jeu* jeu
@return none
*/
liste_niveau* jeuGetListeNiveau(jeu* jeu);

/**
@brief recupère le tableau de monstre
@param jeu* jeu
@return pointeur sur tableau_monstre
*/
tableau_monstre* jeuGetTableauMonstre(jeu* jeu);

/**
@brief recupère le tableau d'arme
@param jeu* jeu
@return pointeur sur tableau_arme
*/
tableau_arme* jeuGetTableauArme(jeu* jeu);

/**
@brief modifie le hero par rapport au jeu
@param jeu* jeu, Hero* hero
@return none
*/
void jeuSetHero(jeu* jeu,Hero* hero);

/**
@brief change la liste de niveau (ne sert que pour l'initialisation)
@param jeu* jeu, liste_niveau* lniv
@return none
*/
void jeuSetListeNiveau(jeu* jeu,liste_niveau* lniv);

/**
@brief change le tableau de monstre
@param jeu* jeu, tableau_monstre* tmon
@return none
*/
void jeuSetTableauMonstre(jeu* jeu,tableau_monstre* tmon);

/**
@brief modifie le tableau d'arme
@param jeu* jeu, tableau_arme* arme
@return none
*/
void jeuSetTableauArme(jeu* jeu,tableau_arme* tarme);

/**
@brief bouge le hero par l'action au clavier
@param jeu* jeu, caractère constante touche
@return none
*/
void jeuActionClavier(jeu* jeu,const char touche);

/**
@brief recupère le numero du terrain sur lequel se trouve le Hero
@param jeu* jeu
@return pointeur sur Terrain
*/
Terrain* jeuGetTerrain(jeu* jeu);

/**
@brief recupère le niveau sur lequel se trouve le Hero
@param jeu* jeu
@return pointeur sur Niveau
*/
Niveau* jeuGetNiveau(jeu* jeu);

/**
@brief recupère les coordonnées du point de depart du niveau
@param jeu* jeu, entier niv et pointeurs sur entier x y
@return none
*/
void jeuRechercheDebutNiveau(jeu* jeu,int niv,int* x,int* y);

/**
@brief trie le tableau de monstre suivant le niveau et le terrain
@param jeu* jeu
@return none
*/
void jeuTrieTableauMonstre(jeu* jeu);

/**
@brief cherche combien il y a de monstre sur ce terrain et quelle est la position du premier montre dans le tableau
@param jeu* jeu, entiers niv ter, pointeur sur entier nbrMon
@return entier
*/
int jeuChercheMonstreTerrain(jeu* jeu,int niv, int ter,int* nbrMon);

/**
@brief gère les éventuels dégats que se serait pris un mionstre si le héros à attaqué un monstre.
@param jeu* jeu
@return none
*/
void attaque(jeu* jeu);

/**
@brief gère les éventuels dégats du héros qu'il pourrait se prendre s'il rencontre un monstre.
@param jeu* jeu
@return none
*/
void contact(jeu* jeu);

void changementArmeHero(jeu* jeu,int id);

void verifPosition(jeu* jeu);
#endif
